/*! Selectric ß v1.13.0 (2017-08-22) - git.io/tjl9sQ - Copyright (c) 2017 Leonardo Santos - MIT License */ !(function(e) {
"function" == typeof define && define.amd ?
define(["jquery"], e) :
"object" == typeof module && module.exports ?
(module.exports = function(t, s) {
return (
void 0 === s &&
(s =
"undefined" != typeof window ?
require("jquery") :
require("jquery")(t)),
e(s),
s
);
}) :
e(jQuery);
})(function(e) {
"use strict";
var t = e(document),
s = e(window),
l = ["a", "e", "i", "o", "u", "n", "c", "y"],
i = [
/[\xE0-\xE5]/g,
/[\xE8-\xEB]/g,
/[\xEC-\xEF]/g,
/[\xF2-\xF6]/g,
/[\xF9-\xFC]/g,
/[\xF1]/g,
/[\xE7]/g,
/[\xFD-\xFF]/g,
],
n = function(t, s) {
var l = this;
(l.element = t),
(l.$element = e(t)),
(l.state = {
multiple: !!l.$element.attr("multiple"),
enabled: !1,
opened: !1,
currValue: -1,
selectedIdx: -1,
highlightedIdx: -1,
}),
(l.eventTriggers = {
open: l.open,
close: l.close,
destroy: l.destroy,
refresh: l.refresh,
init: l.init,
}),
l.init(s);
};
(n.prototype = {
utils: {
isMobile: function() {
return /android|ip(hone|od|ad)/i.test(navigator.userAgent);
},
escapeRegExp: function(e) {
return e.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
},
replaceDiacritics: function(e) {
for (var t = i.length; t--;) e = e.toLowerCase().replace(i[t], l[t]);
return e;
},
format: function(e) {
var t = arguments;
return ("" + e).replace(/\{(?:(\d+)|(\w+))\}/g, function(e, s, l) {
return l && t[1] ? t[1][l] : t[s];
});
},
nextEnabledItem: function(e, t) {
for (; e[(t = (t + 1) % e.length)].disabled;);
return t;
},
previousEnabledItem: function(e, t) {
for (; e[(t = (t > 0 ? t : e.length) - 1)].disabled;);
return t;
},
toDash: function(e) {
return e.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase();
},
triggerCallback: function(t, s) {
var l = s.element,
i = s.options["on" + t],
n = [l].concat([].slice.call(arguments).slice(1));
e.isFunction(i) && i.apply(l, n),
e(l).trigger("selectric-" + this.toDash(t), n);
},
arrayToClassname: function(t) {
var s = e.grep(t, function(e) {
return !!e;
});
return e.trim(s.join(" "));
},
},
init: function(t) {
var s = this;
if (
((s.options = e.extend(!0, {}, e.fn.selectric.defaults, s.options, t)),
s.utils.triggerCallback("BeforeInit", s),
s.destroy(!0),
s.options.disableOnMobile && s.utils.isMobile())
)
return void(s.disableOnMobile = !0);
s.classes = s.getClassNames();
var l = e("", {
class: s.classes.input,
readonly: s.utils.isMobile(),
}),
i = e("
", {
class: s.classes.items,
tabindex: -1
}),
n = e("", {
class: s.classes.scroll
}),
a = e("", {
class: s.classes.prefix,
html: s.options.arrowButtonMarkup,
}),
o = e("", {
class: "label"
}),
r = s.$element.wrap("").parent().append(a.prepend(o), i, l),
u = e("", {
class: s.classes.hideselect
});
(s.elements = {
input: l,
items: i,
itemsScroll: n,
wrapper: a,
label: o,
outerWrapper: r,
}),
s.options.nativeOnMobile &&
s.utils.isMobile() &&
((s.elements.input = void 0),
u.addClass(s.classes.prefix + "-is-native"),
s.$element.on("change", function() {
s.refresh();
})),
s.$element.on(s.eventTriggers).wrap(u),
(s.originalTabindex = s.$element.prop("tabindex")),
s.$element.prop("tabindex", -1),
s.populate(),
s.activate(),
s.utils.triggerCallback("Init", s);
},
activate: function() {
var e = this,
t = e.elements.items
.closest(":visible")
.children(":hidden")
.addClass(e.classes.tempshow),
s = e.$element.width();
t.removeClass(e.classes.tempshow),
e.utils.triggerCallback("BeforeActivate", e),
e.elements.outerWrapper.prop(
"class",
e.utils.arrayToClassname([
e.classes.wrapper,
e.$element.prop("class").replace(/\S+/g, e.classes.prefix + "-$&"),
e.options.responsive ? e.classes.responsive : "",
])
),
e.options.inheritOriginalWidth &&
s > 0 &&
e.elements.outerWrapper.width(s),
e.unbindEvents(),
e.$element.prop("disabled") ?
(e.elements.outerWrapper.addClass(e.classes.disabled),
e.elements.input && e.elements.input.prop("disabled", !0)) :
((e.state.enabled = !0),
e.elements.outerWrapper.removeClass(e.classes.disabled),
(e.$li = e.elements.items.removeAttr("style").find("li")),
e.bindEvents()),
e.utils.triggerCallback("Activate", e);
},
getClassNames: function() {
var t = this,
s = t.options.customClass,
l = {};
return (
e.each(
"Input Items Open Disabled TempShow HideSelect Wrapper Focus Hover Responsive Above Below Scroll Group GroupLabel".split(
" "
),
function(e, i) {
var n = s.prefix + i;
l[i.toLowerCase()] = s.camelCase ? n : t.utils.toDash(n);
}
),
(l.prefix = s.prefix),
l
);
},
setLabel: function() {
var t = this,
s = t.options.labelBuilder;
if (t.state.multiple) {
var l = e.isArray(t.state.currValue) ?
t.state.currValue :
[t.state.currValue];
l = 0 === l.length ? [0] : l;
var i = e.map(l, function(s) {
return e.grep(t.lookupItems, function(e) {
return e.index === s;
})[0];
});
(i = e.grep(i, function(t) {
return i.length > 1 || 0 === i.length ? "" !== e.trim(t.value) : t;
})),
(i = e.map(i, function(l) {
return e.isFunction(s) ? s(l) : t.utils.format(s, l);
})),
t.options.multiple.maxLabelEntries &&
(i.length >= t.options.multiple.maxLabelEntries + 1 ?
((i = i.slice(0, t.options.multiple.maxLabelEntries)),
i.push(
e.isFunction(s) ?
s({
text: "..."
}) :
t.utils.format(s, {
text: "..."
})
)) :
i.slice(i.length - 1)),
t.elements.label.html(i.join(t.options.multiple.separator));
} else {
var n = t.lookupItems[t.state.currValue];
t.elements.label.html(e.isFunction(s) ? s(n) : t.utils.format(s, n));
}
},
populate: function() {
var t = this,
s = t.$element.children(),
l = t.$element.find("option"),
i = l.filter(":selected"),
n = l.index(i),
a = 0,
o = t.state.multiple ? [] : 0;
i.length > 1 &&
t.state.multiple &&
((n = []),
i.each(function() {
n.push(e(this).index());
})),
(t.state.currValue = ~n ? n : o),
(t.state.selectedIdx = t.state.currValue),
(t.state.highlightedIdx = t.state.currValue),
(t.items = []),
(t.lookupItems = []),
s.length &&
(s.each(function(s) {
var l = e(this);
if (l.is("optgroup")) {
var i = {
element: l,
label: l.prop("label"),
groupDisabled: l.prop("disabled"),
items: [],
};
l.children().each(function(s) {
var l = e(this);
(i.items[s] = t.getItemData(
a,
l,
i.groupDisabled || l.prop("disabled")
)),
(t.lookupItems[a] = i.items[s]),
a++;
}),
(t.items[s] = i);
} else(t.items[s] = t.getItemData(a, l, l.prop("disabled"))), (t.lookupItems[a] = t.items[s]), a++;
}),
t.setLabel(),
t.elements.items.append(
t.elements.itemsScroll.html(t.getItemsMarkup(t.items))
));
},
getItemData: function(t, s, l) {
var i = this;
return {
index: t,
element: s,
value: s.val(),
className: s.prop("class"),
text: s.html(),
slug: e.trim(i.utils.replaceDiacritics(s.html())),
alt: s.attr("data-alt"),
selected: s.prop("selected"),
disabled: l,
};
},
getItemsMarkup: function(t) {
var s = this,
l = "";
return (
e.isFunction(s.options.listBuilder) &&
s.options.listBuilder &&
(t = s.options.listBuilder(t)),
e.each(t, function(t, i) {
void 0 !== i.label ?
((l += s.utils.format(
'- {3}
',
s.utils.arrayToClassname([
s.classes.group,
i.groupDisabled ? "disabled" : "",
i.element.prop("class"),
]),
s.classes.grouplabel,
i.element.prop("label")
)),
e.each(i.items, function(e, t) {
l += s.getItemMarkup(t.index, t);
}),
(l += "
")) :
(l += s.getItemMarkup(i.index, i));
}),
l + "
"
);
},
getItemMarkup: function(t, s) {
var l = this,
i = l.options.optionsItemBuilder,
n = {
value: s.value,
text: s.text,
slug: s.slug,
index: s.index
};
return l.utils.format(
'{3}',
t,
l.utils.arrayToClassname([
s.className,
t === l.items.length - 1 ? "last" : "",
s.disabled ? "disabled" : "",
s.selected ? "selected" : "",
]),
e.isFunction(i) ?
l.utils.format(i(s, this.$element, t), s) :
l.utils.format(i, n)
);
},
unbindEvents: function() {
var e = this;
e.elements.wrapper
.add(e.$element)
.add(e.elements.outerWrapper)
.add(e.elements.input)
.off(".sl");
},
bindEvents: function() {
var t = this;
t.elements.outerWrapper.on("mouseenter.sl mouseleave.sl", function(s) {
e(this).toggleClass(t.classes.hover, "mouseenter" === s.type),
t.options.openOnHover &&
(clearTimeout(t.closeTimer),
"mouseleave" === s.type ?
(t.closeTimer = setTimeout(
e.proxy(t.close, t),
t.options.hoverIntentTimeout
)) :
t.open());
}),
t.elements.wrapper.on("click.sl", function(e) {
t.state.opened ? t.close() : t.open(e);
}),
(t.options.nativeOnMobile && t.utils.isMobile()) ||
(t.$element.on("focus.sl", function() {
t.elements.input.focus();
}),
t.elements.input
.prop({
tabindex: t.originalTabindex,
disabled: !1
})
.on("keydown.sl", e.proxy(t.handleKeys, t))
.on("focusin.sl", function(e) {
t.elements.outerWrapper.addClass(t.classes.focus),
t.elements.input.one("blur", function() {
t.elements.input.blur();
}),
t.options.openOnFocus && !t.state.opened && t.open(e);
})
.on("focusout.sl", function() {
t.elements.outerWrapper.removeClass(t.classes.focus);
})
.on("input propertychange", function() {
var s = t.elements.input.val(),
l = new RegExp("^" + t.utils.escapeRegExp(s), "i");
clearTimeout(t.resetStr),
(t.resetStr = setTimeout(function() {
t.elements.input.val("");
}, t.options.keySearchTimeout)),
s.length &&
e.each(t.items, function(e, s) {
if (!s.disabled) {
if (l.test(s.text) || l.test(s.slug))
return void t.highlight(e);
if (s.alt)
for (
var i = s.alt.split("|"), n = 0; n < i.length && i[n]; n++
)
if (l.test(i[n].trim())) return void t.highlight(e);
}
});
})),
t.$li.on({
mousedown: function(e) {
e.preventDefault(), e.stopPropagation();
},
click: function() {
return t.select(e(this).data("index")), !1;
},
});
},
handleKeys: function(t) {
var s = this,
l = t.which,
i = s.options.keys,
n = e.inArray(l, i.previous) > -1,
a = e.inArray(l, i.next) > -1,
o = e.inArray(l, i.select) > -1,
r = e.inArray(l, i.open) > -1,
u = s.state.highlightedIdx,
p = (n && 0 === u) || (a && u + 1 === s.items.length),
c = 0;
if (((13 !== l && 32 !== l) || t.preventDefault(), n || a)) {
if (!s.options.allowWrap && p) return;
n && (c = s.utils.previousEnabledItem(s.lookupItems, u)),
a && (c = s.utils.nextEnabledItem(s.lookupItems, u)),
s.highlight(c);
}
if (o && s.state.opened)
return (
s.select(u),
void(
(s.state.multiple && s.options.multiple.keepMenuOpen) ||
s.close()
)
);
r && !s.state.opened && s.open();
},
refresh: function() {
var e = this;
e.populate(), e.activate(), e.utils.triggerCallback("Refresh", e);
},
setOptionsDimensions: function() {
var e = this,
t = e.elements.items
.closest(":visible")
.children(":hidden")
.addClass(e.classes.tempshow),
s = e.options.maxHeight,
l = e.elements.items.outerWidth(),
i = e.elements.wrapper.outerWidth() - (l - e.elements.items.width());
!e.options.expandToItemText || i > l ?
(e.finalWidth = i) :
(e.elements.items.css("overflow", "scroll"),
e.elements.outerWrapper.width(9e4),
(e.finalWidth = e.elements.items.width()),
e.elements.items.css("overflow", ""),
e.elements.outerWrapper.width("")),
e.elements.items.width(e.finalWidth).height() > s &&
e.elements.items.height(s),
t.removeClass(e.classes.tempshow);
},
isInViewport: function() {
var e = this;
if (!0 === e.options.forceRenderAbove)
e.elements.outerWrapper.addClass(e.classes.above);
else if (!0 === e.options.forceRenderBelow)
e.elements.outerWrapper.addClass(e.classes.below);
else {
var t = s.scrollTop(),
l = s.height(),
i = e.elements.outerWrapper.offset().top,
n = e.elements.outerWrapper.outerHeight(),
a = i + n + e.itemsHeight <= t + l,
o = i - e.itemsHeight > t,
r = !a && o,
u = !r;
e.elements.outerWrapper.toggleClass(e.classes.above, r),
e.elements.outerWrapper.toggleClass(e.classes.below, u);
}
},
detectItemVisibility: function(t) {
var s = this,
l = s.$li.filter("[data-index]");
s.state.multiple &&
((t = e.isArray(t) && 0 === t.length ? 0 : t),
(t = e.isArray(t) ? Math.min.apply(Math, t) : t));
var i = l.eq(t).outerHeight(),
n = l[t].offsetTop,
a = s.elements.itemsScroll.scrollTop(),
o = n + 2 * i;
s.elements.itemsScroll.scrollTop(
o > a + s.itemsHeight ? o - s.itemsHeight : n - i < a ? n - i : a
);
},
open: function(s) {
var l = this;
if (l.options.nativeOnMobile && l.utils.isMobile()) return !1;
l.utils.triggerCallback("BeforeOpen", l),
s &&
(s.preventDefault(),
l.options.stopPropagation && s.stopPropagation()),
l.state.enabled &&
(l.setOptionsDimensions(),
e("." + l.classes.hideselect, "." + l.classes.open)
.children()
.selectric("close"),
(l.state.opened = !0),
(l.itemsHeight = l.elements.items.outerHeight()),
(l.itemsInnerHeight = l.elements.items.height()),
l.elements.outerWrapper.addClass(l.classes.open),
l.elements.input.val(""),
s && "focusin" !== s.type && l.elements.input.focus(),
setTimeout(function() {
t.on("click.sl", e.proxy(l.close, l)).on(
"scroll.sl",
e.proxy(l.isInViewport, l)
);
}, 1),
l.isInViewport(),
l.options.preventWindowScroll &&
t.on(
"mousewheel.sl DOMMouseScroll.sl",
"." + l.classes.scroll,
function(t) {
var s = t.originalEvent,
i = e(this).scrollTop(),
n = 0;
"detail" in s && (n = -1 * s.detail),
"wheelDelta" in s && (n = s.wheelDelta),
"wheelDeltaY" in s && (n = s.wheelDeltaY),
"deltaY" in s && (n = -1 * s.deltaY),
((i === this.scrollHeight - l.itemsInnerHeight && n < 0) ||
(0 === i && n > 0)) &&
t.preventDefault();
}
),
l.detectItemVisibility(l.state.selectedIdx),
l.highlight(l.state.multiple ? -1 : l.state.selectedIdx),
l.utils.triggerCallback("Open", l));
},
close: function() {
var e = this;
e.utils.triggerCallback("BeforeClose", e),
t.off(".sl"),
e.elements.outerWrapper.removeClass(e.classes.open),
(e.state.opened = !1),
e.utils.triggerCallback("Close", e);
},
change: function() {
var t = this;
t.utils.triggerCallback("BeforeChange", t),
t.state.multiple ?
(e.each(t.lookupItems, function(e) {
(t.lookupItems[e].selected = !1),
t.$element.find("option").prop("selected", !1);
}),
e.each(t.state.selectedIdx, function(e, s) {
(t.lookupItems[s].selected = !0),
t.$element.find("option").eq(s).prop("selected", !0);
}),
(t.state.currValue = t.state.selectedIdx),
t.setLabel(),
t.utils.triggerCallback("Change", t)) :
t.state.currValue !== t.state.selectedIdx &&
(t.$element
.prop("selectedIndex", (t.state.currValue = t.state.selectedIdx))
.data("value", t.lookupItems[t.state.selectedIdx].text),
t.setLabel(),
t.utils.triggerCallback("Change", t));
},
highlight: function(e) {
var t = this,
s = t.$li.filter("[data-index]").removeClass("highlighted");
t.utils.triggerCallback("BeforeHighlight", t),
void 0 === e ||
-1 === e ||
t.lookupItems[e].disabled ||
(s.eq((t.state.highlightedIdx = e)).addClass("highlighted"),
t.detectItemVisibility(e),
t.utils.triggerCallback("Highlight", t));
},
select: function(t) {
var s = this,
l = s.$li.filter("[data-index]");
if (
(s.utils.triggerCallback("BeforeSelect", s, t),
void 0 !== t && -1 !== t && !s.lookupItems[t].disabled)
) {
if (s.state.multiple) {
s.state.selectedIdx = e.isArray(s.state.selectedIdx) ?
s.state.selectedIdx :
[s.state.selectedIdx];
var i = e.inArray(t, s.state.selectedIdx); -
1 !== i ?
s.state.selectedIdx.splice(i, 1) :
s.state.selectedIdx.push(t),
l
.removeClass("selected")
.filter(function(t) {
return -1 !== e.inArray(t, s.state.selectedIdx);
})
.addClass("selected");
} else
l.removeClass("selected")
.eq((s.state.selectedIdx = t))
.addClass("selected");
(s.state.multiple && s.options.multiple.keepMenuOpen) || s.close(),
s.change(),
s.utils.triggerCallback("Select", s, t);
}
},
destroy: function(e) {
var t = this;
t.state &&
t.state.enabled &&
(t.elements.items
.add(t.elements.wrapper)
.add(t.elements.input)
.remove(),
e || t.$element.removeData("selectric").removeData("value"),
t.$element
.prop("tabindex", t.originalTabindex)
.off(".sl")
.off(t.eventTriggers)
.unwrap()
.unwrap(),
(t.state.enabled = !1));
},
}),
(e.fn.selectric = function(t) {
return this.each(function() {
var s = e.data(this, "selectric");
s && !s.disableOnMobile ?
"string" == typeof t && s[t] ?
s[t]() :
s.init(t) :
e.data(this, "selectric", new n(this, t));
});
}),
(e.fn.selectric.defaults = {
onChange: function(t) {
e(t).change();
},
maxHeight: 300,
keySearchTimeout: 500,
arrowButtonMarkup: '▾',
disableOnMobile: !1,
nativeOnMobile: !0,
openOnFocus: !0,
openOnHover: !1,
hoverIntentTimeout: 500,
expandToItemText: !1,
responsive: !1,
preventWindowScroll: !0,
inheritOriginalWidth: !1,
allowWrap: !0,
forceRenderAbove: !1,
forceRenderBelow: !1,
stopPropagation: !0,
optionsItemBuilder: "{text}",
labelBuilder: "{text}",
listBuilder: !1,
keys: {
previous: [37, 38],
next: [39, 40],
select: [9, 13, 27],
open: [13, 32, 37, 38, 39, 40],
close: [9, 27],
},
customClass: {
prefix: "selectric",
camelCase: !1
},
multiple: {
separator: ", ",
keepMenuOpen: !0,
maxLabelEntries: !1
},
});
});